/* 
 * File:   NombreSimple.cpp
 * Author: Gab'z
 * 
 * Created on 1 mai 2012, 19:46
 */

#include "NombreSimple.h"
#include "Entier.h"
#include "Rationnel.h"
#include "Reel.h"

NombreSimple::~NombreSimple() {
}

NombreSimple* add(const NombreSimple* c1, const NombreSimple* c2) {
    const Entier* p_entier1 = dynamic_cast<const Entier*> (c1);
    const Entier* p_entier2 = dynamic_cast<const Entier*> (c2);
    const Rationnel* p_rationnel1 = dynamic_cast<const Rationnel*> (c1);
    const Rationnel* p_rationnel2 = dynamic_cast<const Rationnel*> (c2);
    const Reel* p_reel1 = dynamic_cast<const Reel*> (c1);
    const Reel* p_reel2 = dynamic_cast<const Reel*> (c2);
    if (p_reel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_reel1 + *p_reel2);
        else if (p_rationnel2 != 0) return new Reel(*p_reel1 + *p_rationnel2);
        else if (p_entier2 != 0) return new Reel(*p_reel1 + *p_entier2);
        else std::cout << "add reel + constantesimple echec\n";
    } else if (p_rationnel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_rationnel1 + *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_rationnel1 + *p_rationnel2);
        else if (p_entier2 != 0) return new Rationnel(*p_rationnel1 + *p_entier2);
        else std::cout << "add rationnel + constantesimple echec\n";
    } else if (p_entier1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_entier1 + *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_entier1 + *p_rationnel2);
        else if (p_entier2 != 0) return new Entier(*p_entier1 + *p_entier2);
        else std::cout << "add entier + constantesimple echec\n";
    } else std::cout << "add constsimple + constantesimple ECHEC";
    return 0;
    // throw std::exception("erreur addition *Constante Simple");
}

NombreSimple* sub(const NombreSimple* c1, const NombreSimple* c2) {
    const Entier* p_entier1 = dynamic_cast<const Entier*> (c1);
    const Entier* p_entier2 = dynamic_cast<const Entier*> (c2);
    const Rationnel* p_rationnel1 = dynamic_cast<const Rationnel*> (c1);
    const Rationnel* p_rationnel2 = dynamic_cast<const Rationnel*> (c2);
    const Reel* p_reel1 = dynamic_cast<const Reel*> (c1);
    const Reel* p_reel2 = dynamic_cast<const Reel*> (c2);
    if (p_reel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_reel1 - *p_reel2);
        else if (p_rationnel2 != 0) return new Reel(*p_reel1 - *p_rationnel2);
        else if (p_entier2 != 0) return new Reel(*p_reel1 - *p_entier2);
        else std::cout << "sub reel - constantesimple echec\n";
    } else if (p_rationnel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_rationnel1 - *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_rationnel1 - *p_rationnel2);
        else if (p_entier2 != 0) return new Rationnel(*p_rationnel1 - *p_entier2);
        else std::cout << "sub rationnel - constantesimple echec\n";
    } else if (p_entier1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_entier1 - *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_entier1 - *p_rationnel2);
        else if (p_entier2 != 0) return new Entier(*p_entier1 - *p_entier2);
        else std::cout << "sub entier - constantesimple echec\n";
    } else std::cout << "sub constsimple - constantesimple ECHEC";
    return 0;
    // throw std::exception("erreur soustraction *Constante Simple");
}

NombreSimple* mul(const NombreSimple* c1, const NombreSimple* c2) {
    const Entier* p_entier1 = dynamic_cast<const Entier*> (c1);
    const Entier* p_entier2 = dynamic_cast<const Entier*> (c2);
    const Rationnel* p_rationnel1 = dynamic_cast<const Rationnel*> (c1);
    const Rationnel* p_rationnel2 = dynamic_cast<const Rationnel*> (c2);
    const Reel* p_reel1 = dynamic_cast<const Reel*> (c1);
    const Reel* p_reel2 = dynamic_cast<const Reel*> (c2);
    if (p_reel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_reel1 * *p_reel2);
        else if (p_rationnel2 != 0) return new Reel(*p_reel1 * *p_rationnel2);
        else if (p_entier2 != 0) return new Reel(*p_reel1 * *p_entier2);
        else std::cout << "mul reel * constantesimple echec\n";
    } else if (p_rationnel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_rationnel1 * *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_rationnel1 * *p_rationnel2);
        else if (p_entier2 != 0) return new Rationnel(*p_rationnel1 * *p_entier2);
        else std::cout << "mul rationnel * constantesimple echec\n";
    } else if (p_entier1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_entier1 * *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_entier1 * *p_rationnel2);
        else if (p_entier2 != 0) return new Entier(*p_entier1 * *p_entier2);
        else std::cout << "mul entier * constantesimple echec\n";
    } else std::cout << "mul constsimple * constantesimple ECHEC";
    return 0;
    // throw std::exception("erreur multiplication *Constante Simple");
}

NombreSimple* div(const NombreSimple* c1, const NombreSimple* c2) {
    const Entier* p_entier1 = dynamic_cast<const Entier*> (c1);
    const Entier* p_entier2 = dynamic_cast<const Entier*> (c2);
    const Rationnel* p_rationnel1 = dynamic_cast<const Rationnel*> (c1);
    const Rationnel* p_rationnel2 = dynamic_cast<const Rationnel*> (c2);
    const Reel* p_reel1 = dynamic_cast<const Reel*> (c1);
    const Reel* p_reel2 = dynamic_cast<const Reel*> (c2);
    if (p_reel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_reel1 / *p_reel2);
        else if (p_rationnel2 != 0) return new Reel(*p_reel1 / *p_rationnel2);
        else if (p_entier2 != 0) return new Reel(*p_reel1 / *p_entier2);
        else std::cout << "div reel / constantesimple echec\n";
    } else if (p_rationnel1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_rationnel1 / *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_rationnel1 / *p_rationnel2);
        else if (p_entier2 != 0) return new Rationnel(*p_rationnel1 / *p_entier2);
        else std::cout << "div rationnel / constantesimple echec\n";
    } else if (p_entier1 != 0) {
        if (p_reel2 != 0) return new Reel(*p_entier1 / *p_reel2);
        else if (p_rationnel2 != 0) return new Rationnel(*p_entier1 / *p_rationnel2);
        else if (p_entier2 != 0) return new Entier(*p_entier1 / *p_entier2);
        else std::cout << "div entier / constantesimple echec\n";
    } else std::cout << "div constsimple / constantesimple ECHEC";
    return 0;
    // throw std::exception("erreur division *Constante Simple");
}